﻿#ifndef MAINWINDOW_H_

#define MAINWINDOW_H_

#include <QObject>
#include <QWidget>
#include "ui_RemoteFileDialog.h"
#include <QDir>
#include <QStandardItemModel>
#include <QFileIconProvider>
#include <QStandardPaths>
#include <QDiriterator>
#include <QFileIconProvider>
#include <QLineEdit>
#include <QMenu>
#include <QCursor>
#include <QDesktopServices>
#include <QElapsedTimer>
#include <QPen>
#include <QHeaderView>
#include <QTimer>


#include "Util.h"
#include "eventfilterobject.h"


#include <QWebSocket>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QBuffer>
#include <QMessageBox>
#include <QPainter>






namespace Ui
{
	class Form;
}



class RemoteFileDialog : public QWidget
{
	Q_OBJECT

private:
	Ui::Form* ui;

	//客户端：
	QWebSocket* m_websockclient{};

	QFile* m_recvfile{};
	quint64 m_totalfilesize;
	QString m_filename;


	//提供icon图标的类对象：
	QFileIconProvider m_fileIconprovider;



	//本地文件：
	QDir			m_localFileDir;
	QStandardItemModel* m_localFileModel{};			//最好加上花括号，初始化一下


	//远程文件：
	QDir			m_remoteFileDir;
	QStandardItemModel* m_remoteFileModel{};		//最好加上花括号，初始化一下


	//下载细节展示：
	QStandardItemModel* m_detailModel{};
	bool m_fileTransmissionStopped = false;

	//右键菜单，上下文菜单：
	QMenu* m_contextmenu{};

	enum MenuType{localmenu,remotemenu};
	int m_menutype{};
	//保存复制、删除、改名的文件：
	QString m_optionfile;
	//该复制文件的复制来源类型（从哪个设备中复制来的）：
	int m_optionype{ -1 };


	//显示传输速度：
	QElapsedTimer m_elapsedtimier;

public:
	RemoteFileDialog(QWidget* parent = nullptr);
	~RemoteFileDialog();

	//初始化：
	void init();
	void layoutinit();
	void localinit();
	void remoteinit();
	void detailinit();

	//web连接：
	void start(const QUrl& url);

	//设置view的水平表头：
	void SetViewHorizontalHead(QHeaderView* header, QStandardItemModel* m_model, QTableView* ui);

	//本地设备：
	void UpdateLocalFile();
	void setLocalFilePath(const QString& path);

	//远程设备：
	void SendJson(const QJsonObject& qobject);		
	QJsonObject GetAllFiles(const QString& path);								//获取所有文件
	void GetRemoteFile();							//获取远程文件
	void UpdateRemoteFile(const QJsonObject& object);
	void setRemoteFilePath(const QString& path);

	//细节展示：
	void UpdateDetailView(QString data = "");

	//菜单函数：
	void SendFile_or_Folder(const QString& sourcepath, const QString& peersavepath);
	void SendFile(const QString& filenamepath, const QString& peersavepath);
	void SendFolder(const QString& folderpatth, const QString& peersavepath);

public slots:
	//web连接：
	void onConnected();
	void onDisConnected();
	void onBinaryMessageReceived(const QByteArray& data);
	void onTextMessageReceived(const QString& data);
	void onSocketstateChanged(QAbstractSocket::SocketState state);

	//本地设备：
	void onLocalFileBack();
	void onLocalFileFlush();
	void onLocalTableViewDoubleClicked(const QModelIndex& index);

	//传输按钮槽函数：
	void transmit();
	void onAllStart();
	void onAllPause();
	void onAllCancel();

	//远程设备：
	void onRemoteFileBack();
	void onRemoteFileFlush();
	void onRemoteTableViewDoubleClicked(const QModelIndex& index);
public slots:
	void on_minBtn_released();			//最小化按钮
	void on_maxBtn_released();			//最大化按钮
	void on_closeBtn_released();		//关闭按钮
public:
	void paintEvent(QPaintEvent* ev) override;

signals:
	void transmitdata(QString);
	void totalsleep(int);


};


#endif // !MAINWINDOW_H_
